使用Keras建立簡單的CNN模型
Keras建立模型有三種方法:1.Sequential 2.Funciton API 3.自定義
我們用第一種Sequential,然後對model.add一層一層的增加Layer
CNN會有卷積層、池化層、全連接層
這些名詞第一次聽到會很陌生,要全部搞懂需要把論文、微積分、線性代數讀通,所以我們以潛白的話語來形容
建立模型model = Sequential()
卷積層:
Convolution2D:Convolution是卷積,因為圖片是二維,所以叫2D
batch_input_shape:輸入的向量格式,None就是之前-1的意思,1代表channel(灰階為1,RGB為3),28,28是長寬
filters過濾器ㄤ像是機器的圖形識別器,一開始隨機產生,有的是識別直線、橫線、斜線等等,經過訓練後,去偵測圖的紋理特徵
kernel_size:每個filter的大小,通常會用5x5或3x3,設定5或3,經驗上效果最好
strides:filter去掃這張圖時,每次跨一步,橫向每次跨一步,橫向掃完後依序往直向跨一步,直到整張圖掃完
padding:'same'會在這張圖周圍補白邊,這樣用5x5或3x3掃圖完後,掃出來的圖的大小才會與原圖一樣大
data_format:channels_first就會是(None, 1, 28, 28),如果channels_last就會是(None, 28, 28, 1),這在GPU運算上速度會有差別
model.add(Convolution2D(
batch_input_shape=(None, 1, 28, 28),
filters=32,
kernel_size=5,
strides=1,
padding='same', # Padding method
data_format='channels_first',
))
卷積完,通常會做激勵函數relu,正數保持原數、負數會變成0,圖片的神經網路通常正數才是我們要的參數,幫助神經網路提高效率、減少不必要的計算model.add(Activation('relu'))
然後做一個池化層
MaxPooling2D:最大池化層
pool_size=2:想像每2x2的像素,四個像素中哪個數字最大,就保留這格的值
strides=2:每次跨兩步,輸入張量會變成原來的一半。想像整張照片會縮小成原來寬的1/2、長的1/2
model.add(MaxPooling2D(
pool_size=2,
strides=2,
padding='same',
data_format='channels_first',
))
以上「卷積層、激勵函數、池化層」可以重複好幾次,不斷去抽取特徵,從最小的紋理、到逐漸變大的局部特徵(例如一開始的線條紋理,後面則是眼睛、鼻子、車燈、杯子等大特徵)
全連接層
我們會把向量先壓扁,從2D變成1D一長串的向量
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
然後我們最後會預測問題是分類的問題,例如數字是0~9共十個分類,因此接一個Dense10,並且用softmax作為multi-class的分類問題(這些名詞未來會說明)
model.add(Dense(10))
model.add(Activation('softmax'))